**TAREA 2, MOD 3**
Juan Gonzalez
Pablo Walters
1) Realizar una interacción de tipo slider que separe la base de datos por categorías de pingüino (25%)
2) Realizar una interacción de tipo botón que cambie el tipo de gráfico (E.j: Scatter a Bar), para un gráfico con subplot (40%)
3) Realizar una interacción de tipo desplegable que cambie la visibilidad de las trazas, para un gráfico estratificado (o superpuesto) y agregar una nota que señala un punto a destacar (35%)
import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
df = pd.read_csv('/Users/milan/penguins_cleaned.csv', sep= ',')
df.head()
| species | island | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | sex | |
|---|---|---|---|---|---|---|---|
| 0 | Adelie | Torgersen | 39.1 | 18.7 | 181 | 3750 | male |
| 1 | Adelie | Torgersen | 39.5 | 17.4 | 186 | 3800 | female |
| 2 | Adelie | Torgersen | 40.3 | 18.0 | 195 | 3250 | female |
| 3 | Adelie | Torgersen | 36.7 | 19.3 | 193 | 3450 | female |
| 4 | Adelie | Torgersen | 39.3 | 20.6 | 190 | 3650 | male |
adelie=df[df['species']=="Adelie"]
gentoo=df[df['species']=="Gentoo"]
chinstrap=df[df['species']=="Chinstrap"]
text = []
for i in adelie.index:
text.append("Peso:"+ str(adelie['body_mass_g'][i]/1000)+" KG<br>Largo aleta:"+ str(adelie['flipper_length_mm'][i]))
plot = go.Figure(data=[go.Scatter(
x=adelie['bill_length_mm'],
y=adelie['bill_depth_mm'],
text=text,
mode='markers',
name= "Adelie",
marker_symbol="square",
marker=dict(
color = '#d5af22',
size=20,
line=dict(width=1,color='Grey')
)
)
])
text = []
for i in gentoo.index:
text.append("Peso:"+ str(gentoo['body_mass_g'][i]/1000)+" KG<br>Largo aleta:"+ str(gentoo['flipper_length_mm'][i]))
plot.add_scatter(
x=gentoo['bill_length_mm'],
y=gentoo['bill_depth_mm'],
text=text,
marker_symbol="pentagon",
name= "Gentoo",
mode='markers',
marker=dict(
color = '#22d5af',
size=20,
line=dict(width=1,color='Grey')
)
)
text = []
for i in chinstrap.index:
text.append("Peso:"+ str(chinstrap['body_mass_g'][i]/1000)+" KG<br>Largo aleta:"+ str(chinstrap['flipper_length_mm'][i]))
plot.add_scatter(
x=chinstrap['bill_length_mm'],
y=chinstrap['bill_depth_mm'],
text=text,
marker_symbol="circle",
name= "Chinstrap",
mode='markers',
marker=dict(
color = '#af22d5',
size=20,
line=dict(width=1,color='Grey')
)
)
plot.update_layout(
title='Comparación de las características del pico de los pinguinos por especie',
xaxis_title="Largo del pico",
yaxis_title="Profundidad del pico",
legend_title="Especie de pinguino",
autosize=False,
width=1000,
height=600,
xaxis=dict(
rangeslider=dict(
visible=True
),
)
)
plot.show()
Al observar los gráficos de dispersión general, entre las variables cuantitativas, no se distingue de forma clara una correlación lineal, a excepción de la variable largo de la aleta, con la masa corporal de los pingüinos.
Al visualizar la dispersión por especie, se ve claramente una correlación directa de las variables Largo del pico y Profundidad del pico.
plot = go.Figure(data=[go.Scatter(
x=adelie['island'].value_counts().index,
y=adelie['island'].value_counts(),
name= "Adelie",
mode='markers',
marker=dict(
color = '#d5af22',
size=20,
line=dict(width=1,color='Grey')
),
)
])
plot.add_scatter(
x=gentoo['island'].value_counts().index,
y=gentoo['island'].value_counts(),
marker_symbol="pentagon",
name= "Gentoo",
mode='markers',
marker=dict(
color = '#22d5af',
size=20,
line=dict(width=1,color='Grey')
)
)
plot.add_scatter(
x=chinstrap['island'].value_counts().index,
y=chinstrap['island'].value_counts(),
marker_symbol="circle",
name= "Chinstrap",
mode='markers',
marker=dict(
color = '#af22d5',
size=20,
line=dict(width=1,color='Grey')
)
)
# Add dropdown
plot.update_layout(
title='Pinguinos en cada isla',
xaxis_title="Islas",
yaxis_title="Cantidad de pinguinos",
legend_title="Islas",
autosize=False,
barmode='stack',
width=1000,
height=600,
updatemenus=[
dict(
type="buttons",
direction="left",
pad={"r": 10, "t": 10},
showactive=True,
x=0.18,
xanchor="left",
y=-0.30,
yanchor="bottom",
buttons=list([
dict(
args=["type", "scatter"],
label="Puntos",
method="restyle"
),
dict(
args=["type", "bar"],
label="Barras",
method="restyle"
),
]),
),
]
)
plot.update_layout(
annotations=[
dict(text="Opciones de gráfica:", showarrow=False, x=0, y=-0.29, yref="paper", align="left")
])
plot.show()
Se puede observar la cantidad de Pingüinos por su variable categórica,Especie e Isla donde habitan. Se puede observar que la mayor población de pingüinos se encuentra en la Isla Biscoe, cuya principal especie corresponde al pingüino Gentoo, el cual, no se encuentra en las otras islas.
La especie Christrap, también se encuentra en solo 1 isla (Dream Islas).
La especie con mayor población global es coincidente, con la especie que tiene presencia en las 3 Islas.
from plotly.subplots import make_subplots
import plotly.graph_objects as go
fig = make_subplots(rows=1, cols=3)
fig.append_trace(go.Histogram(
x=adelie['body_mass_g'],
histnorm='probability',
name= "Adelie",
marker_color='#d5af22',
), row=1, col=1)
fig.append_trace(go.Histogram(
x=gentoo['body_mass_g'],
histnorm='probability',
name= "Gentoo",
marker_color='#22d5af',
), row=1, col=2)
fig.append_trace(go.Histogram(
x=chinstrap['body_mass_g'],
histnorm='probability',
name= "Chinstrap",
marker_color='#af22d5',
), row=1, col=3)
fig.update_xaxes(
tickangle = 90,
title_text = "Peso",
title_standoff = 25)
fig.update_layout(
title='Histograma, Boxplot y Violín del peso de los pinguinos por especie',
legend_title="Especie",
autosize=False,
width=1000,
height=600,
updatemenus=[
dict(
type="buttons",
direction="left",
pad={"r": 10, "t": 10},
showactive=True,
x=0.35,
xanchor="left",
y=-0.41,
yanchor="bottom",
buttons=list([
dict(
args=["type", "histogram"],
label="Histograma",
method="restyle"
),
dict(
args=["type", "box"],
label="boxplot",
method="restyle"
),
dict(
args=["type", "violin"],
label="Violin",
method="restyle"
)
]),
),
]
)
fig.show()
Se puede observar una distribución de tipo normal, de la variable de peso para cada especie.
La Especie Chinstrap es la única que presenta datos outlier.
La especie Gentoo es la que tiene un rango de peso más amplio de aprox de 2 KG.
fig = go.Figure()
dream_c=df[(df['island']=="Dream") & (df['species']=="Chinstrap")]
dream_a=df[(df['island']=="Dream") & (df['species']=="Adelie")]
torgersen_a=df[(df['island']=="Torgersen") & (df['species']=="Adelie")]
biscoe_a=df[(df['island']=="Biscoe") & (df['species']=="Adelie")]
biscoe_g=df[(df['island']=="Biscoe") & (df['species']=="Gentoo")]
adelie_m=adelie[adelie['sex']=="male"]
adelie_f=adelie[adelie['sex']=="female"]
gentoo_m=gentoo[gentoo['sex']=="male"]
gentoo_f=gentoo[gentoo['sex']=="female"]
chinstrap_m=chinstrap[chinstrap['sex']=="male"]
chinstrap_f=chinstrap[chinstrap['sex']=="female"]
fig.add_trace(
go.Scatter(
x=dream_c['body_mass_g'],
y=dream_c['flipper_length_mm'],
marker_symbol="circle",
name= "Chinstrap de Dream",
mode='markers',
marker=dict(
color = '#af22d5',
size=10,
line=dict(width=1,color='Grey')
)
)
)
fig.add_trace(
go.Scatter(
x=dream_a['body_mass_g'],
y=dream_a['flipper_length_mm'],
mode="markers",
name= "Adelie de Dream",
marker_symbol="triangle-left",
marker=dict(
color = '#d5af22',
size=10,
line=dict(width=1,color='Grey')
)
)
)
fig.add_trace(
go.Scatter(
x=biscoe_a['body_mass_g'],
y=biscoe_a['flipper_length_mm'],
mode="markers",
name= "Adelie de Biscoe",
marker_symbol="triangle-up",
marker=dict(
color = '#d5af22',
size=10,
line=dict(width=1,color='Grey')
)
)
)
fig.add_trace(
go.Scatter(
x=biscoe_g['body_mass_g'],
y=biscoe_g['flipper_length_mm'],
mode="markers",
name= "Gentoo de Biscoe",
marker_symbol="pentagon",
marker=dict(
color = '#22d5af',
size=10,
line=dict(width=1,color='Grey')
)
)
)
fig.add_trace(
go.Scatter(
x=torgersen_a['body_mass_g'],
y=torgersen_a['flipper_length_mm'],
mode="markers",
name= "Adelie de Torgersen",
marker_symbol="triangle-down",
marker=dict(
color = '#d5af22',
size=10,
line=dict(width=1,color='Grey')
)
)
)
# Add buttons that add shapes
chinstrap_dream= [dict(type="rectagle",
xref="x", yref="y",
x0=min(dream_c['body_mass_g']), y0=min(dream_c['flipper_length_mm']),
x1=max(dream_c['body_mass_g']), y1=max(dream_c['flipper_length_mm']),
line=dict(color="#af22d5"))]
adelie_dream = [dict(type="rectagle",
xref="x", yref="y",
x0=min(dream_a['body_mass_g']), y0=min(dream_a['flipper_length_mm']),
x1=max(dream_a['body_mass_g']), y1=max(dream_a['flipper_length_mm']),
line=dict(color="#352c09"))]
adelie_biscoe = [dict(type="rectagle",
xref="x", yref="y",
x0=min(biscoe_a['body_mass_g']), y0=min(biscoe_a['flipper_length_mm']),
x1=max(biscoe_a['body_mass_g']), y1=max(biscoe_a['flipper_length_mm']),
line=dict(color="#6b5711"))]
gentoo_biscoe = [dict(type="rectagle",
xref="x", yref="y",
x0=min(biscoe_g['body_mass_g']), y0=min(biscoe_g['flipper_length_mm']),
x1=max(biscoe_g['body_mass_g']), y1=max(biscoe_g['flipper_length_mm']),
line=dict(color="#22d5af"))]
adelie_torgersen = [dict(type="rectagle",
xref="x", yref="y",
x0=min(torgersen_a['body_mass_g']), y0=min(torgersen_a['flipper_length_mm']),
x1=max(torgersen_a['body_mass_g']), y1=max(torgersen_a['flipper_length_mm']),
line=dict(color="#a0831a"))]
adelie_all = [dict(type="rectagle",
xref="x", yref="y",
x0=min(adelie['body_mass_g']), y0=min(adelie['flipper_length_mm']),
x1=max(adelie['body_mass_g']), y1=max(adelie['flipper_length_mm']),
line=dict(color="#d5af22"))]
adelie_m_c = [dict(type="rectagle",
xref="x", yref="y",
x0=min(adelie_m['body_mass_g']), y0=min(adelie_m['flipper_length_mm']),
x1=max(adelie_m['body_mass_g']), y1=max(adelie_m['flipper_length_mm']),
line=dict(color="blue"))]
adelie_m_f = [dict(type="rectagle",
xref="x", yref="y",
x0=min(adelie_f['body_mass_g']), y0=min(adelie_f['flipper_length_mm']),
x1=max(adelie_f['body_mass_g']), y1=max(adelie_f['flipper_length_mm']),
line=dict(color="pink"))]
gentoo_m_c = [dict(type="rectagle",
xref="x", yref="y",
x0=min(gentoo_m['body_mass_g']), y0=min(gentoo_m['flipper_length_mm']),
x1=max(gentoo_m['body_mass_g']), y1=max(gentoo_m['flipper_length_mm']),
line=dict(color="blue"))]
gentoo_m_f = [dict(type="rectagle",
xref="x", yref="y",
x0=min(gentoo_f['body_mass_g']), y0=min(gentoo_f['flipper_length_mm']),
x1=max(gentoo_f['body_mass_g']), y1=max(gentoo_f['flipper_length_mm']),
line=dict(color="pink"))]
chinstrap_m_c = [dict(type="rectagle",
xref="x", yref="y",
x0=min(chinstrap_m['body_mass_g']), y0=min(chinstrap_m['flipper_length_mm']),
x1=max(chinstrap_m['body_mass_g']), y1=max(chinstrap_m['flipper_length_mm']),
line=dict(color="blue"))]
chinstrap_m_f = [dict(type="rectagle",
xref="x", yref="y",
x0=min(chinstrap_f['body_mass_g']), y0=min(chinstrap_f['flipper_length_mm']),
x1=max(chinstrap_f['body_mass_g']), y1=max(chinstrap_f['flipper_length_mm']),
line=dict(color="pink"))]
fig.update_layout(
updatemenus=[
dict(buttons=list([
dict(label="Ninguno",
method="relayout",
args=["shapes", []]),
dict(label="Chinstrap de Dream",
method="relayout",
args=["shapes", chinstrap_dream]),
dict(label="Adelie de Dream",
method="relayout",
args=["shapes", adelie_dream]),
dict(label="Adelie de Torgersen",
method="relayout",
args=["shapes", adelie_torgersen]),
dict(label="Adelie de Biscoe",
method="relayout",
args=["shapes", adelie_biscoe]),
dict(label="Adelie según su sexo",
method="relayout",
args=["shapes", adelie_m_c+adelie_m_f]),
dict(label="Gentoo según su sexo",
method="relayout",
args=["shapes", gentoo_m_c+gentoo_m_f]),
dict(label="Chinstrap según su sexo",
method="relayout",
args=["shapes", chinstrap_m_c+chinstrap_m_f]),
dict(label="Gentoo de Biscoe",
method="relayout",
args=["shapes", gentoo_biscoe]),
dict(label="Todos los Adelie",
method="relayout",
args=["shapes", adelie_all]),
]),
)
]
)
fig.add_annotation(
x=6300,
y=221,
xref="x",
yref="y",
text="Espécimen más pesado",
showarrow=True,
font=dict(
family="Courier New, monospace",
size=14,
color="#1a1e1e"
),
align="center",
arrowhead=2,
arrowsize=1,
arrowwidth=2,
arrowcolor="#1a1e1e",
ax=50,
ay=-50,
opacity=0.8
)
fig.add_annotation(
x=3150,
y=171,
xref="x",
yref="y",
text="Espécimen de las aletas más cortas",
showarrow=True,
font=dict(
family="Courier New, monospace",
size=14,
color="#1a1e1e"
),
align="center",
arrowhead=2,
arrowsize=1,
arrowwidth=2,
arrowcolor="#1a1e1e",
ax=-50,
ay=50,
opacity=0.8
)
fig.add_annotation(
x=3150,
y=171,
xref="x",
yref="y",
text="Espécimen de las aletas más cortas",
showarrow=True,
font=dict(
family="Courier New, monospace",
size=14,
color="#1a1e1e"
),
align="center",
arrowhead=2,
arrowsize=1,
arrowwidth=2,
arrowcolor="#1a1e1e",
ax=-50,
ay=50,
opacity=0.8
)
# Update remaining layout properties
fig.update_layout(
title='Dispersión del tamaño de los pinguinos y sus islas de procedencia',
xaxis_title="Peso",
yaxis_title="Largo de sus aletas",
legend_title="Especie y población",
autosize=False,
width=1000,
height=800,
showlegend=True,
)
fig.show()
Independientemente de la especie, existe una correlación entre el peso y el largo de la aleta.
Al diferencias a las especies por sexo, se puede identificar que las hembras mantienen una proporción corporal más pequeña que los machos.
Chinstrap y Adelie mantienen una proporción corporal parecida.
El espécimen con la aleta más corta es un Adelie con peso 3,150 KG.
El espécimen con más pesado es un Gentoo con peso 6,300 KG